package modelo;

import java.util.ArrayList;

import niveles.Nivel1;
import niveles.Nivel2;

public class Juego {
	
	private ArrayList<Nivel> niveles = new ArrayList<Nivel>();
	private Nivel nivelActual;
	private int numeroNivelActual = 0;
	
	private boolean juegoPerdido = false;
    private boolean nivelPerdido = false;
    private boolean juegoGanado = false;
    private boolean nivelGanado = false;;
	
	public Juego() {
		this.cargarNiveles();
		this.nivelActual = this.niveles.get(numeroNivelActual);
		this.nivelActual.cargarNivel();
	}
	
	public void cargarNiveles() {
		this.niveles.add(new Nivel1());
		this.niveles.add(new Nivel2());
	}
	
    public boolean getNivelPasado() {
        return this.nivelGanado;
    }
	
	public boolean getNivelPerdido() {
	    return this.nivelPerdido;
	}
	
	public boolean getJuegoPerdido() {
	    return this.juegoPerdido;
	}
	
	public boolean getJuegoHaTerminado() {
	    return this.juegoGanado;
	}
	
	public Nivel getNivelActual() {
	    return this.nivelActual;
	}
	
	public void restartNivel() {
	    this.nivelActual.getEscenario().getObjetos().clear();
        this.nivelActual.getJugador().resetear();
	    this.nivelActual.cargarNivel();
	    this.nivelPerdido = false;
	}
	
	public void avanzarNivel() {
	    TanqueAlgo jugador = this.nivelActual.getJugador();

        this.nivelActual.getEscenario().getObjetos().clear();
	    Escenario escenario = this.nivelActual.getEscenario();
	    
	    this.numeroNivelActual += 1;
	    this.nivelActual = this.niveles.get(numeroNivelActual);
        this.nivelActual.setJugador(jugador);
        this.nivelActual.setEscenario(escenario);
        this.nivelActual.getJugador().resetear();
	    this.nivelActual.cargarNivel();
	    this.nivelGanado = false;
	}
	
	private boolean noHayMasNiveles() {
	    return (this.numeroNivelActual == (this.niveles.size() - 1) && this.nivelActual.fueGanado());
	}
	
	public void vivir() {
	    
	    double resistenciaCuartel = this.nivelActual.getEscenario().getCuartel().getResistencia();
	    double resistenciaJugador = this.nivelActual.getEscenario().getAlgoTank().getResistencia();
	    int vidasJugador = this.nivelActual.getEscenario().getAlgoTank().getVidas();
	    
	    if (vidasJugador <= 0) {
	        this.juegoPerdido = true;
	        }

	    if (resistenciaJugador <= 0 || resistenciaCuartel <= 0) {
	        this.nivelPerdido = true;
	        }
	    	    
	    if (this.nivelActual.fueGanado()) {
	        if (this.noHayMasNiveles()) {
	            this.juegoGanado = true;
	        } else {
	            this.nivelGanado = true;
	        }
	    }
	    
        this.nivelActual.vivir();
	}
}
